/*
 * @FileName: fsm.h
 * @Author: GreyQiu qiushaogui@aikosolar.com
 * @Date: 2023-07-17 13:18:00
 * @LastEditors: GreyQiu qiushaogui@aikosolar.com
 * @LastEditTime: 2023-08-09 15:03:24
 * @Description: 
 * 
 * Copyright (c) 2023, All Rights Reserved. 
 */

#ifndef __FSM_H__
#define __FSM_H__

#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>

/**
 * @description 事件名称定义
 */
typedef enum EVENT_ENUM
{
    EVENT_NONE = 0,
    EVENT_NORMAL,
    EVENT_ABNORMAL,
    EVENT_NUM
} event_t;

/**
 * @description 事件检查函数指针类型
 */
typedef event_t (*sta_check_t)(void);

/**
 * @description 状态跳转执行函数指针类型
 */
typedef void (*sta_action_t)(void);

/**
 * @description: 状态机结构
 */
typedef struct
{
    uint16_t sta_cur;                    // 当前状态
    uint16_t (*sta_tbl)[EVENT_NUM];               // 状态转移表
    sta_action_t (*action)[EVENT_NUM];           // 状态跳转动作表
    sta_check_t * check;                // 事件检查表
    uint32_t time;                      // 用于状态机记时
} fsm_t;

void fsm_config(fsm_t * fsm, uint16_t (*sta)[EVENT_NUM], sta_action_t (*act)[EVENT_NUM], sta_check_t * check);
void fsm_handler(fsm_t * fsm);
void fsm_time_reset(fsm_t * fsm);
bool fsm_is_timeout(fsm_t * fsm, uint32_t time_exp);

#endif // __FSM_H__
